package main

/*
给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。

有效字符串需满足：

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

作者：力扣 (LeetCode)
链接：https://leetcode-cn.com/leetbook/read/queue-stack/g9d0h/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
*/
import "fmt"

func isValid(s string) bool {
	var stack []rune
	var tmpStack []rune
	if len(s)%2 != 0 {
		return false
	}

	for _, b := range s {
		if len(stack) == 0 {
			stack = append(stack, b)
			fmt.Println(string(stack))
			continue
		}
		switch {
		case b == '{' || b == '[' || b == '(':
			stack = append(stack, b)
			fmt.Println(string(stack))
			continue
		case b == '}' || b == ']' || b == ')':
			// 压栈的时候，如果类似{[]}，里面的[]，在]入栈的时候，如果有配对则其实肯定已经[]完成出栈，所以不用判断tmpStack内容
			for len(stack) > 0 {
				top := stack[len(stack)-1]
				stack = stack[0 : len(stack)-1]
				if top == pair[b] {
					break
				}
				tmpStack = append(tmpStack, top)
			}
			// 所以如果tmpStack在每次找完配对字符后还有数据，说明里面的数据不配对，而且类似({{)}}是不合法，所以直接退出
			if len(tmpStack) != 0 {
				return false
			}
			fmt.Println(string(stack))
		}
	}
	return len(stack) == 0
}

var pair = map[rune]rune{
	']': '[',
	'}': '{',
	')': '(',
}

func main() {
	// s := "([}}])"
	s := "()[]"
	fmt.Println(isValid(s))
}
